Ubuntu 20.04 et KVM : Un bridge "Public"

Comment rendre vos machines virtuelles disponibles sur votre réseau "lan" en quelques minutes !

• 6 min read

Ubuntu 20.04 et KVM : Un bridge "Public"Ubuntu 20.04 et KVM : Un bridge "Public" 
 

Le réseau par défaut fourni par KVM permet aux machines virtuelles de communiquer avec le monde extérieur mais sans être accessible sur le même réseau que votre machine hôte ( votre LAN ).

Mais il est parfois nécessaire que les machines virtuelles puissent partager le même réseau que celui de la machine hôte : il est alors nécessaire de créer un bridge public.

Nous allons voir aujourd'hui comment créer ce Bridge public sur Ubuntu 20.04 et l'utiliser par défaut pour nos machines virtuelles.

Il existe de nombreux articles sur le sujet, mais finalement ces articles utilisent que rarement netplan qui est pourtant bien présent sur Ubuntu depuis la version 17.10 : Oui, le fichier /etc/network/interfaces n'est plus nécessaire ! 😂

KVM

Je ne vais pas détailler l'installation de KVM et son utilisation. Si vous souhaitez prendre le temps pour comprendre les techniques liées à KVM, vous pouvez suivre - par exemple - cet article :

KVM, qu’est-ce que c’est ?

KVM (Kernel-Based Virtual Machine) est l’infrastructure de virtualisation Open Source intégrée à Linux. Découvrez son fonctionnement et ses avantages.

Tout d'abord commençons par l'installation de KVM :

sudo apt install qemu-kvm libvirt-clients libvirt-daemon-system bridge-utils

Je peux vérifier que tout fonctionne avec la commande suivante :

lfache@midgar:~$ virsh list --all

 Id   Name   State

----------------------

La liste est pour le moment vide, puisque nous n'avons créé aucune machine virtuelle !

Vous pouvez également lister les réseaux existants :

lfache@midgar:~$ virsh net-list --all

Vous ne devriez pour le moment avoir que le réseau appelé default.

Je peux vérifier la présence de ce réseau sur ma machine hôte :

lfache@midgar:~$ ip a

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000

    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

    inet 127.0.0.1/8 scope host lo

       valid_lft forever preferred_lft forever

    inet6 ::1/128 scope host

       valid_lft forever preferred_lft forever

2: enp34s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master br0 state UP group default qlen 1000

    link/ether 00:d8:61:a8:96:a8 brd ff:ff:ff:ff:ff:ff

6: virbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000

    link/ether 52:54:00:1d:5b:25 brd ff:ff:ff:ff:ff:ff

7: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc fq_codel master virbr0 state DOWN mode DEFAULT group default qlen 1000

    link/ether 52:54:00:1d:5b:25 brd ff:ff:ff:ff:ff:ff

Les entrées virbr0 et virbr0-nic sont installées par KVM par défaut.

Comme je n'ai pas encore créé de machine virtuelle, je vais tout simplement le supprimer afin de ne pas m'encombrer de réseau inutile sur mon hôte - et éviter les confusions - :

lfache@midgar:~$ virsh net-destroy default

lfache@midgar:~$ virsh net-undefine default

Je vérifie sur ma machine hôte :

lfache@midgar:~$ ip a

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000

    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

    inet 127.0.0.1/8 scope host lo

       valid_lft forever preferred_lft forever

    inet6 ::1/128 scope host

       valid_lft forever preferred_lft forever

2: enp34s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master br0 state UP group default qlen 1000

    link/ether 00:d8:61:a8:96:a8 brd ff:ff:ff:ff:ff:ff

Maintenant nous pouvons créer le bridge public sur notre hôte pour remplacer le réseau que nous venons de supprimer.

Public Bridge

Depuis quelques temps déjà, Ubuntu utilise Netplan pour configurer le réseau. Nous allons configurer notre bridge à l'aide de cet outil qui offre la possibilité de configurer tout ceci avec des fichiers yaml.

Créons donc un fichier /etc/netplan/00-netcfg.yaml :

network:

  ethernets:

    enp34s0:

      dhcp4: no

      # disable existing configuration for ethernet

      #addresses: [192.168.1.10/24]

      #gateway4: 192.168.1.1

      #nameservers:

        #addresses: [192.168.1.1]

      dhcp6: no

  # add configuration for bridge interface

  bridges:

    br0:

      interfaces: [enp34s0]

      dhcp4: no

      addresses: [192.168.1.10/24]

      gateway4: 192.168.1.1

      nameservers:

        addresses: [192.168.1.1]

      parameters:

        stp: false

      dhcp6: no

  version: 2

🚩 Modifiez ce fichier avec le nom de votre interface réseau et de vos paramètres. Les éléments importants à valider sont les suivants : 🚩

 interfaces: [enp34s0]

 addresses: [192.168.1.10/24]

 gateway4: 192.168.1.1

 nameservers:

        addresses: [192.168.1.1]

Enfin vous pouvez appliquer les modifications avec la commande :

lfache@midgar:~$ sudo netplan apply

Validez la bonne création du pont :

lfache@midgar:~$ ip a

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000

    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

    inet 127.0.0.1/8 scope host lo

       valid_lft forever preferred_lft forever

    inet6 ::1/128 scope host

       valid_lft forever preferred_lft forever

2: enp34s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master br0 state UP group default qlen 1000

    link/ether 00:d8:61:a8:96:a8 brd ff:ff:ff:ff:ff:ff

3: wlo1: <NO-CARRIER,BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state DORMANT group default qlen 1000

    link/ether 70:8b:cd:2e:2d:d3 brd ff:ff:ff:ff:ff:ff

4: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000

    link/ether 00:d8:61:a8:96:a8 brd ff:ff:ff:ff:ff:ff

    inet 192.168.1.10/24 brd 192.168.1.255 scope global noprefixroute br0

       valid_lft forever preferred_lft forever

    inet6 fe80::6093:4fff:fe71:d62b/64 scope link

       valid_lft forever preferred_lft forever

5: vnet0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master br0 state UNKNOWN group default qlen 1000

    link/ether fe:54:00:c3:0b:c6 brd ff:ff:ff:ff:ff:ff

    inet6 fe80::fc54:ff:fec3:bc6/64 scope link

       valid_lft forever preferred_lft forever

Enfin je vais déclarer ce bridge à KVM. Pour cela, il faut créer un fichier de définition de réseau au format XML :

<network>

  <name>host-bridge</name>

  <forward mode="bridge"/>

  <bridge name="br0"/>

</network>

Appliquez cette configuration :

virsh net-define host-bridge.xml

virsh net-start host-bridge

virsh net-autostart host-bridge

Et je valide que tout fonctionne :

lfache@midgar:~$ virsh net-list --all

 Name          State    Autostart   Persistent

------------------------------------------------

 host-bridge   active   yes         yes

Nous allons pouvoir créer notre première machine virtuelle avec ce réseau mais totalement en ligne de commande : pas de virt-manager !

KVM Guest

Pour lancer cette machine, je vais utiliser la ligne de commande :

lfache@midgar:~$ virt-install --name vm1 --ram=8192 --disk size=10 --vcpus 6 --os-type linux --os-variant ubuntu20.04 --location 'http://archive.ubuntu.com/ubuntu/dists/focal/main/installer-amd64/' --graphics none  --extra-args 'console=ttyS0,115200n8 serial'

Avec les options suivantes :

Mon installation va se lancer directement en ligne de commande dans mon terminal.

Vous pouvez vérifier que votre machine est bien connectée au bridge que nous avons créé :

lfache@midgar:~$ virsh domiflist vm1

 Interface   Type     Source   Model    MAC

-----------------------------------------------------------

 vnet0       bridge   br0      virtio   52:54:00:c3:0b:c6

🚩 Au cours de l'installation cochez bien la case OpenSSH Server sur les paquets à installer, sinon vous n'aurez pas accès à votre machine par la suite ! 🚩

Une fois l'installation terminée et après le redémarrage, nous allons devoir retrouver l'adresse IP utilisée par votre nouvelle machine.

Il existe plusieurs solutions pour cela, de mon côté, j'utilise la commande nmap pour retrouver très rapidement cette machine sur mon réseau.

lfache@midgar:~$ sudo nmap -sP 192.168.1.0/24

Enfin dans ma liste, je vais rechercher mon adresse MAC et une carte réseau du type QEMU virtual NIC :

MAC Address: 5C:E5:0C:81:67:FA (Unknown)

Nmap scan report for ubuntu-1.home (192.168.1.58)

Host is up (0.000078s latency).

Connectez-vous en ssh sur la machine :

lfache@midgar:~$ ssh lfache@192.168.1.58

Petit bonus, si vous souhaitez utiliser la commande virsh console sur votre système invité, il va falloir éditez le fichier de grub sur votre VM :

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash console=ttyS0"

Enfin on met à jour grub :

lfache@midgar:~$ sudo update-grub

Redémarrez votre machine virtuelle et essayez la connexion en console :

lfache@midgar:~$ virsh console vm1

Tout fonctionne !

 

Nous avons vu ensemble comment créer votre propre bridge public pour vos machines virtuelles créés avec KVM ! Et nous avons utilisé ce bridge pour créer une première machine virtuelle ( sans interface graphique ) qui sera accessible depuis notre réseau local !

Avec les bases acquises aujourd'hui, nous allons pouvoir créer des machines virtuelles un peu plus complexe pour faire certains essais ( comme l'émulation de machine ARM par exemple 😀 )

N'hésitez pas à permettre au blog de continuer à exister et à fournir un contenu de qualité - enfin je l'espère - au travers de vos dons sur : buymeacoff.ee/lfache

Et n'hésitez pas à m'apporter des remarques ou des commentaires sur Twitter, ou ici 👇